﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Dao.Intermediarios;
using _InformaticaIndustrial_DerivdosVinicos.DTO;
using Dao;

//si modifica la cantidad, revisar que se modifique el precio y el subtotal
//controlar la composicion
namespace _InformaticaIndustrial_DerivdosVinicos.Interfaz
{
    public partial class NuevaOrdenCompra : Form
    {

        #region Property

        IPOrdenCompra ipOrdenCompra = new IPOrdenCompra();
        IPMateriaPrima ipMP = new IPMateriaPrima();
        IPComponente ipComponente = new IPComponente();
        IPMedida ipMedidas = new IPMedida();
        IPProveedorMP ipProvMP = new IPProveedorMP();
        IPProveedor ipProveedor = new IPProveedor();
        IPProveedorComp ipProvComp = new IPProveedorComp();
        IPDetalleOC ipDetOC = new IPDetalleOC();
        Componente cp;
        OrdenCompra _ultOC;
        OrdenCompra nuevaOC;
        DetalleOrdenCompra detOC;
        IList<DetalleOrdenCompra> detGuardar = new List<DetalleOrdenCompra>();
        MateriaPrima mp;
        private Principal principal;
        string idIns;
        double total = 0;
        int p;   //para controlar si cargo el combo de Prov_MP o Prov_Comp
        bool t = false;   //lo uso en el caso q sea llamado desde Nva OP
        string mpId = "";
        string compId = "";
        string proMP = "";
        string proCp = "";

        #endregion Property

        public NuevaOrdenCompra(Principal principal)
        {

            InitializeComponent();
            cbComponente.Enabled = false;
            cbInsumos.Enabled = false;
            btAgregar.Enabled = false;
            cbProveedores.Enabled = false;
            this.txtFecha.Text = DateTime.Now.ToShortDateString();

            try
            {
                List<OrdenCompra> lordenes = ipOrdenCompra.getAll<OrdenCompra>();

                if (lordenes.Count == 0)
                    txtNroOC.Text = "1";
                else
                {
                    _ultOC = lordenes.Last();
                    txtNroOC.Text = (_ultOC.nroOrdenCompra + 1).ToString();
                }

                txtTotal.Text = "0.0";

                cargarCombos();
                crearOrdenCompra();
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
            this.principal = principal;
        }
        //para el caso en que sea llamado desde orden de produccion

        List<DTOComprar> faltantes;

        public NuevaOrdenCompra(List<DTOComprar> f)
        {
            //tngo q ver q materias primas son las q se necesitan comprar
            //verificar si ya hay una orden d compra pendiente p esta materia prima
            //verificar si la cantidad es suficiente
            InitializeComponent();
            cbComponente.Enabled = false;
            cbInsumos.Enabled = false;
            btAgregar.Enabled = false;
            cbProveedores.Enabled = false;
            this.txtFecha.Text = DateTime.Now.ToShortDateString();
            t = true;
            this.faltantes = f;

            try
            {
                List<OrdenCompra> lordenes = ipOrdenCompra.getAll<OrdenCompra>();
                if (lordenes.Count == 0)
                    txtNroOC.Text = "1";
                else
                {
                    _ultOC = lordenes.Last();
                    txtNroOC.Text = (_ultOC.nroOrdenCompra + 1).ToString();
                }

                txtTotal.Text = "0.0";

                crearOrdenCompra();

                //aca llenar el datag
                if (t == true)
                {
                    foreach (var item in faltantes)
                    {
                        if (item.esMP == true)
                        {
                            mpId = item.codMP;

                            Proveedor_MP pmateria = ipProvMP.getByCriterio<Proveedor_MP>("IdMP", "=", mpId).Last();
                            mp = ipMP.getByCriterio<MateriaPrima>("", "", mpId).Last();
                            proMP = pmateria.Proveedor.IdProveedor.ToString();
                            verificarOCPendienteMP(mp);
                            //  CargarDetallesMP();
                        }
                        else
                        {
                            compId = item.codPC;
                            Proveedor_Componente pcomp = ipProvComp.getByCriterio<Proveedor_Componente>("IdComponente", "=", compId).Last();
                            cp = ipComponente.getByCriterio<Componente>("", "", compId).Last();
                            proCp = pcomp.Proveedor.IdProveedor.ToString();
                            verificarOCPendienteComp(cp);
                            //CargarDetallesComp();
                        }
                    }
                }

            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }

        }
        public void cargarCombos()
        {
            try
            {
                cbInsumos.DataSource = ipMP.getAll<MateriaPrima>();
                cbComponente.DataSource = ipComponente.getAll<Componente>();
            }
            catch (Exception e1)
            {
                MessageBox.Show(e1.Message);
            }
        }

        public void crearOrdenCompra()
        {
            nuevaOC = new OrdenCompra();
            nuevaOC.nroOrdenCompra = Convert.ToInt16(txtNroOC.Text);
            nuevaOC.fechaCreacion = Convert.ToDateTime(txtFecha.Text);
            nuevaOC.estado = "Pendiente";
            nuevaOC.fechaEntrega = null;
            nuevaOC.total = 0.0;
        }

        private void rbMateriaPrima_CheckedChanged(object sender, EventArgs e)
        {
            cbComponente.Enabled = false;
            cbInsumos.Enabled = true;
            p = 0;
        }

        private void rbComponente_CheckedChanged(object sender, EventArgs e)
        {
            cbInsumos.Enabled = false;
            cbComponente.Enabled = true;
            p = 1;
        }

        public void cargarComboProveedores()
        {
            try
            {
                IList<Proveedor> lista = new List<Proveedor>();

                if (p == 0)
                {
                    idIns = cbInsumos.SelectedValue.ToString();
                    IList<Proveedor_MP> provMP = ipProvMP.getByCriterio<Proveedor_MP>("IdMP", "=", idIns);
                    
                    for (int i = 0; i < provMP.Count; i++)
                    {
                        Proveedor s = provMP[i].Proveedor;
                        // double c = Convert.ToDouble(provMP[i].costo);
                        lista.Add(s);
                    }
                }
                else if (p == 1)
                {
                    idIns = cbComponente.SelectedValue.ToString();
                    IList<Proveedor_Componente> provComp = ipProvComp.getByCriterio<Proveedor_Componente>("IdComponente", "=", idIns);
                    for (int i = 0; i < provComp.Count; i++)
                    {
                        Proveedor s = provComp[i].Proveedor;
                        lista.Add(s);
                    }
                }

                cbProveedores.DataSource = lista;
                // cbProveedores.DisplayMember = "RazonSocial";
            }
            catch (Exception exp)
            {
                MessageBox.Show(exp.Message);
            }
        }

        private void cmdSalir_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btAgregar_Click(object sender, EventArgs e)
        {
            if (p == 0)
            {
                mpId = mp.IdMP.ToString();
                proMP = cbProveedores.SelectedValue.ToString();
                CargarDetallesMP();
                detGuardar.Add(detOC);
                txtTotal.Text = total.ToString();
            }
            else if (p == 1)
            {
                compId = cp.IdComponente.ToString();
                proCp = cbProveedores.SelectedValue.ToString();
                CargarDetallesComp();
                detGuardar.Add(detOC);
                txtTotal.Text = total.ToString();

            }
        }

        public void CargarDetallesMP()
        {
            total = 0;
            txtTotal.Text = "";
            List<DetalleOrdenCompra> detalles = ipDetOC.getByCriterio<DetalleOrdenCompra>("IdMateriaPrima", "=", mpId);
            IList<Proveedor_MP> listProv = ipProvMP.getCriterioById<Proveedor_MP>("", "", Convert.ToInt16(proMP));

            Proveedor_MP proveed = listProv.Last();
            detOC = new DetalleOrdenCompra();

            DataGridViewRow fila = new DataGridViewRow();
            DataGridViewTextBoxCell cell = new DataGridViewTextBoxCell();
            cell = new DataGridViewTextBoxCell();

            //costo de la materia prima
            cell.Value = mp.codigo;
            fila.Cells.Add(cell);
            //nombre
            cell = new DataGridViewTextBoxCell();
            cell.Value = mp.nombre;
            fila.Cells.Add(cell);
            //cantidad
            cell = new DataGridViewTextBoxCell();
            cell.Value = mp.TamLoteFijo;
            fila.Cells.Add(cell);
            //precio de la materia prima
            cell = new DataGridViewTextBoxCell();
            cell.Value = mp.costo;
            fila.Cells.Add(cell);

            detOC.IdMateriaPrima = mp.IdMP;
            detOC.cantidad = Convert.ToInt16(mp.TamLoteFijo);
            detOC.subtotal = Convert.ToDouble(mp.costo);

            //subtotal--este puede llegar a cambiar
            cell = new DataGridViewTextBoxCell();
            cell.Value = detOC.cantidad * mp.costo;
            fila.Cells.Add(cell);
            dgDetalleOC.Rows.Add(fila);

            //total = total + Convert.ToDouble(mp.costo);
            for (int r = 0; r < dgDetalleOC.Rows.Count; r++)
            {
                total += Convert.ToDouble(dgDetalleOC.Rows[r].Cells["Subtotal"].Value);
            }
            txtTotal.Text = total.ToString();
        }

        public void CargarDetallesComp()
        {
            total = 0;
            txtTotal.Text = "";
            List<DetalleOrdenCompra> detalles = ipDetOC.getByCriterio<DetalleOrdenCompra>("IdComponente", "=", compId);
            IList<Proveedor_Componente> listProv = ipProvComp.getCriterioById<Proveedor_Componente>("", "", Convert.ToInt16(proCp));//Convert.ToInt16(proCp));compId

            Proveedor_Componente proveed = listProv.Last();

            detOC = new DetalleOrdenCompra();

            DataGridViewRow fila = new DataGridViewRow();
            DataGridViewTextBoxCell cell = new DataGridViewTextBoxCell();
            cell = new DataGridViewTextBoxCell();

            //codigo del componnete
            cell.Value = cp.codigo;
            fila.Cells.Add(cell);
            //nombre
            cell = new DataGridViewTextBoxCell();
            cell.Value = cp.nombre;
            fila.Cells.Add(cell);
            //cantidad--HAY Q CAMBIAR POR LOTE FIJO?????????????????????
            cell = new DataGridViewTextBoxCell();
            cell.Value = cp.cantidad;
            fila.Cells.Add(cell);
            //precio deL COMPONENTE
            cell = new DataGridViewTextBoxCell();
            cell.Value = cp.costo;
            fila.Cells.Add(cell);
            //subtotal--este puede llegar a cambiar
            
            detOC.IdComponente = cp.IdComponente;
            detOC.cantidad = Convert.ToInt16(cp.cantidad);
            detOC.subtotal = Convert.ToDouble(cp.costo);

            //total = total + Convert.ToDouble(cp.costo);

            cell = new DataGridViewTextBoxCell();
            cell.Value = detOC.cantidad * cp.costo;
            fila.Cells.Add(cell);
            dgDetalleOC.Rows.Add(fila);

            for (int r = 0; r < dgDetalleOC.Rows.Count; r++)
            {
                total += Convert.ToDouble(dgDetalleOC.Rows[r].Cells["Subtotal"].Value);
            }
            txtTotal.Text = total.ToString();
        }

        private void cmdGuardar_Click(object sender, EventArgs e)
        {
            try
            {
                nuevaOC.total = Convert.ToDouble(txtTotal.Text);
                ipOrdenCompra.save<OrdenCompra>(nuevaOC);
                Intermediario.confirmarCambios();

                List<OrdenCompra> ordenes = ipOrdenCompra.getAll<OrdenCompra>();

                foreach (DetalleOrdenCompra item in detGuardar)
                {
                    item.idOC = nuevaOC.idOC;//Convert.ToInt16(txtNroOC.Text);               //nva.idOC + 1;
                    ipDetOC.save<DetalleOrdenCompra>(item);// (detOC);
                    Intermediario.confirmarCambios();
                }
                MessageBox.Show("La Orden de Compra Nº " + txtNroOC.Text + " ha sido correctamente creada.");
                cmdGuardar.Enabled = false;
            }
            catch (Exception exc)
            {
                MessageBox.Show(exc.Message);
            }
        }

        private void btProveedores_Click(object sender, EventArgs e)
        {
            try
            {
                if (p == 0)
                {
                    mp = ipMP.getPorCriterio<MateriaPrima>(cbInsumos.Text).Last<MateriaPrima>();

                    List<DetalleOrdenCompra> detalles = ipDetOC.getByCriterio<DetalleOrdenCompra>("IdMateriaPrima", "=", mp.IdMP.ToString());

                    if (detalles.Count != 0)
                    {
                        detOC = detalles.First<DetalleOrdenCompra>();
                        IList<OrdenCompra> msj = ipOrdenCompra.getOrdenCompras<OrdenCompra>("", "", Convert.ToInt16(detOC.idOC));
                        OrdenCompra o;
                        o = msj.First<OrdenCompra>();

                        if (o.estado == "Pendiente")
                        {
                            DialogResult decision;
                            //MessageBox.Show("Ya existe una orden de compra asociada a esta Materia Prima.\n Orden de compra Nº: " + o.nroOrdenCompra);
                            decision = MessageBox.Show("Ya existe una orden de compra para a esta Materia Prima.\n Orden de compra Nº: " + o.nroOrdenCompra + "\nDesea crear una Nueva OC?", "Atencion", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);

                            if (decision.Equals(DialogResult.OK))
                            {
                                cargarComboProveedores();
                                btAgregar.Enabled = true;
                            }
                            else
                            {
                                MessageBox.Show("La OC no fue creada.");
                                this.Close();
                            }
                        }
                        else
                            btAgregar.Enabled = true;
                        cbProveedores.Enabled = true;
                        cargarComboProveedores();
                    }
                    else
                    {
                        cbProveedores.Enabled = true;
                        btAgregar.Enabled = true;
                        cargarComboProveedores();
                    }

                }
                else if (p == 1)
                {
                    cp = ipComponente.getPorCriterio<Componente>(cbComponente.Text).Last<Componente>();

                    List<DetalleOrdenCompra> detalles = ipDetOC.getByCriterio<DetalleOrdenCompra>("IdComponente", "=", cp.IdComponente.ToString());

                    if (detalles.Count != 0)
                    {
                        detOC = detalles.First<DetalleOrdenCompra>();
                        IList<OrdenCompra> msj = ipOrdenCompra.getOrdenCompras<OrdenCompra>("", "", Convert.ToInt16(detOC.idOC));
                        OrdenCompra o;
                        o = msj.First<OrdenCompra>();

                        if (o.estado == "Pendiente")
                        {
                            DialogResult decision;
                            decision = MessageBox.Show("Ya existe una orden de compra asociada a este Componente.\n Orden de compra Nº: " + o.nroOrdenCompra + "\nDesea crear una Nueva OC?", "Atencion", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);

                            if (decision.Equals(DialogResult.OK))
                                cargarComboProveedores();
                            else
                            {
                                MessageBox.Show("La OC no fue creada.");
                                this.Close();
                            }
                        }

                        else
                        {
                            btAgregar.Enabled = true;
                            cbProveedores.Enabled = true;
                            cargarComboProveedores();
                        }
                    }
                    else
                    {
                        btAgregar.Enabled = true;
                        cbProveedores.Enabled = true;
                        cargarComboProveedores();
                    }
                }
            }
            catch (Exception ee)
            {
                MessageBox.Show(ee.Message);
            }
        }

        public void verificarOCPendienteMP(MateriaPrima mp)
        {
            try
            {
                this.mp = mp;

               // mp = ipMP.getByCriterio<MateriaPrima>("", "", mpId).Last<MateriaPrima>();

                List<DetalleOrdenCompra> detalles = ipDetOC.getByCriterio<DetalleOrdenCompra>("IdMateriaPrima", "=", mp.IdMP.ToString());

                if (detalles.Count != 0)
                {
                    detOC = detalles.First<DetalleOrdenCompra>();
                    IList<OrdenCompra> msj = ipOrdenCompra.getOrdenCompras<OrdenCompra>("", "", Convert.ToInt16(detOC.idOC));
                    OrdenCompra o;
                    o = msj.First<OrdenCompra>();

                    if (o.estado == "Pendiente")
                    {
                        DialogResult decision;
                        //MessageBox.Show("Ya existe una orden de compra asociada a esta Materia Prima.\n Orden de compra Nº: " + o.nroOrdenCompra);
                        decision = MessageBox.Show("Ya existe una orden de compra para a esta Materia Prima.\n Orden de compra Nº: " + o.nroOrdenCompra + "\nDesea crear una Nueva OC?", "Atencion", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);

                        if (decision.Equals(DialogResult.OK))
                            CargarDetallesMP();
                        else
                        {
                            MessageBox.Show("La OC no fue creada.");
                            this.Close();
                        }
                    }

                }
                else 
                {
                    CargarDetallesMP();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Se ha producido un error en verificar OC ptes de MP: " + ex.Message);
            }

        }

        public void verificarOCPendienteComp(Componente cp)
        {
            try
            {
                this.cp = cp;

                List<DetalleOrdenCompra> detalles = ipDetOC.getByCriterio<DetalleOrdenCompra>("IdComponente", "=", cp.IdComponente.ToString());

                if (detalles.Count != 0)
                {
                    detOC = detalles.First<DetalleOrdenCompra>();
                    IList<OrdenCompra> msj = ipOrdenCompra.getOrdenCompras<OrdenCompra>("", "", Convert.ToInt16(detOC.idOC));
                    OrdenCompra o;
                    o = msj.First<OrdenCompra>();

                    if (o.estado == "Pendiente")
                    {
                        DialogResult decision;
                        decision = MessageBox.Show("Ya existe una orden de compra asociada a este Componente.\n Orden de compra Nº: " + o.nroOrdenCompra + "\nDesea crear una Nueva OC?", "Atencion", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);

                        if (decision.Equals(DialogResult.OK))
                            CargarDetallesComp();
                        else
                        {
                            MessageBox.Show("La OC no fue creada.");
                            this.Close();
                        }
                    }

                }
                else 
                {
                    CargarDetallesComp();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Se ha producido un error en verificar OC ptes de MP: " + ex.Message);
            }
        }


        private void dgDetalleOC_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            total = 0;
            int i = e.RowIndex;
            int c;
            if (p == 0)
                c = Convert.ToInt16(mp.TamLoteFijo);
            else
                c = Convert.ToInt16(cp.cantidad);
            double cant = Convert.ToDouble(dgDetalleOC.Rows[i].Cells["Cantidad"].Value);
            double precio = Convert.ToDouble(dgDetalleOC.Rows[i].Cells["Precio"].Value);
            double subtotal = (cant * precio);   //  / c;
           // double subtotal = Convert.ToDouble(dgDetalleOC.Rows[i].Cells["Subtotal"].Value);
            dgDetalleOC.Rows[i].Cells["Subtotal"].Value = subtotal;

            //total = total + subtotal;

            //total = total + tot;

            for (int r = 0; r < dgDetalleOC.Rows.Count; r++)
            {
                total += Convert.ToDouble(dgDetalleOC.Rows[r].Cells["Subtotal"].Value);
            }

            txtTotal.Text = total.ToString();
        }
    }
}

